#include "NVIC_Manage.h"

void NVIC_Manage(void){
    //开启SYSCFG的时钟(APB2上)
    __HAL_RCC_SYSCFG_CLK_ENABLE();
    
    //NVIC_PriorityGroup_2可以跳转查看分组说明，确实支支持16个优先级，并且可能会分为抢占和响应
    //对中断优先级寄存器8位分组
    SCB->AIRCR &= (0x00);
    SCB->AIRCR |= (0xF5FA0000);
    SCB->AIRCR |= 0x0300;//设置为4-0分组，抢占优先级16，子优先级0
    
    //使能所有的External中断（0-239 IRQS）
    NVIC->ISER[0] = 0xFFFFFFFF;
    NVIC->ISER[1] = 0xFFFFFFFF;
    NVIC->ISER[2] = 0xFFFFFFFF;
    NVIC->ISER[3] = 0xFFFFFFFF;
    NVIC->ISER[4] = 0xFFFFFFFF;
    NVIC->ISER[5] = 0xFFFFFFFF;
    NVIC->ISER[6] = 0xFFFFFFFF;
    NVIC->ISER[7] = 0xFFFFFFFF;
    
    //对外部中断的优先级进行设置
    //但是我们已经设置了最大可用优先级为15(Macro)，最低优先级为15(Macro)，可用位数为4
    NVIC->IP[28] = 4;//TIM2 Global IT
    NVIC->IP[30] = 4;//TIM4 Global IT
    NVIC->IP[37] = 4;//USART1 Global IT
    NVIC->IP[38] = 4;//USART2 Global IT
    NVIC->IP[50] = 4;//TIM5 Global IT
    NVIC->IP[6]  = 4;//EXTI0 Global IT
    NVIC->IP[7]  = 4;//EXTI1 Global IT
    NVIC->IP[8]  = 4;//EXTI2 Global IT
    NVIC->IP[9]  = 4;//EXTI3 Global IT
    NVIC->IP[10] = 4;//EXTI4 Global IT
    NVIC->IP[23] = 4;//EXTI9-5 Global IT
    NVIC->IP[40] = 4;//EXTI15-10 Global IT
    
    //对EXTIx的中断源进行选择，我们在I2C里面只是用到了PC4和PC5
    SYSCFG->EXTICR[1] = 0x0022;//设置EXTI4和EXTI5的中断源为PC4和PC5
    
    //有关System Control Block的寄存器设置----SCB
    //个人觉得在我们的设计中，SysTick并需要特别精准，所以我将SysTick设置可抢占为2
//    SCB->SHP[10] = 15;//PendSV的优先级设置
//    SCB->SHP[11] = 7;//SysTick的优先级设置
}